package soundChaser;

public class AutoCorrelation extends Thread
{
	public double[][] ergebnisArray;
	private long samplingFrequenz = 0;
	private double[][] werteArray;

	public AutoCorrelation (long laenge, long samplingFrequenz, double[][] werteArray)
	{
		ergebnisArray = new double[2][(int)(laenge/samplingFrequenz + 1)];
		this.samplingFrequenz = samplingFrequenz;
		this.werteArray = werteArray;
	}
	
	public void run() 
	{
		double durchschnittErsterKanal = 0;
		double durchschnittZweiterKanal = 0;
		double summeErsterKanal = 0;
		double summeZweiterKanal = 0;
		int schrittWeite = (int) samplingFrequenz;
		int k = 0;

		for (int j = 0; j < werteArray[0].length-1 ;) 
		{
			if(j+schrittWeite > werteArray[0].length)
				schrittWeite = werteArray[0].length%schrittWeite - 1;
			// mean value
			for (int i = j; i < j + schrittWeite; i++) 
			{
				// add mean
				durchschnittErsterKanal += werteArray[0][i];
				durchschnittZweiterKanal += werteArray[1][i];
			}
			// build mean
			durchschnittErsterKanal /= (double)schrittWeite;
			durchschnittZweiterKanal /= (double)schrittWeite;

			// autocorrelation only tau = 0, covariance
			for (int i = j; i < j + schrittWeite; i++) 
			{
				// add to sum
				summeErsterKanal += werteArray[0][i] * werteArray[0][i]
						- durchschnittErsterKanal * durchschnittZweiterKanal;
				summeZweiterKanal += werteArray[1][i] * werteArray[1][i]
						- durchschnittZweiterKanal * durchschnittZweiterKanal;
			}
			// bias covariance
			summeErsterKanal /= (double)schrittWeite;
			summeZweiterKanal /= (double)schrittWeite;

			ergebnisArray[0][k] = summeErsterKanal;
			ergebnisArray[1][k] = summeZweiterKanal;
			k++;
			j = j + schrittWeite;
		}
	}
}